package com.potenza.edu.media.service;


import com.aliyun.oss.OSS;
import com.aliyun.oss.model.ObjectMetadata;
import com.aliyun.oss.model.UploadFileRequest;
import com.rabbitmq.client.Channel;
import org.springframework.amqp.core.Message;
import org.springframework.amqp.rabbit.annotation.RabbitHandler;
import org.springframework.amqp.rabbit.annotation.RabbitListener;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Service;

import java.io.IOException;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Map;

@Service
public class MQService_OSSBackup {

    @Value("${oss.bucket}")
    private String bucket;

    @Value("${oss.hostName}")
    private String hostName;

    @Autowired
    private OSS ossClient;

    SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-DD HH:mm:ss");
    @RabbitHandler
    @RabbitListener(queues={"Queue_OSS_BACKUP"})
    public void msgRev(Channel channel, Message message, Map ossBackMap){
        System.out.println(simpleDateFormat.format(new Date()) + "  A接收到的消息："+ ossBackMap);

        long deliveryTag = message.getMessageProperties().getDeliveryTag();
        System.out.println("deliveryTag=" + deliveryTag);

        String filePath = (String)ossBackMap.get("filePath");
        String mimetype = (String)ossBackMap.get("mimetype");
        String fileMd5 = (String)ossBackMap.get("fileMd5");
        String fileExt = (String)ossBackMap.get("fileExt");
        ossUpload(filePath,mimetype,fileMd5,fileExt);

        try {
            channel.basicAck(deliveryTag,false);
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    private void ossUpload(String filePath,
                           String mimetype,
                           String fileMd5,
                           String fileExt){
        ObjectMetadata meta = new ObjectMetadata();
        // 指定上传的内容类型。
        meta.setContentType(mimetype);
        // 文件上传时设置访问权限ACL。
        // meta.setObjectAcl(CannedAccessControlList.Private);

        // 通过UploadFileRequest设置多个参数。
        // 依次填写Bucket名称（例如examplebucket）以及Object完整路径（例如exampledir/exampleobject.txt），Object完整路径中不能包含Bucket名称。
        UploadFileRequest uploadFileRequest = new UploadFileRequest(bucket,
                fileMd5+"." +fileExt);

        // 通过UploadFileRequest设置单个参数。
        // 填写本地文件的完整路径，例如D:\\localpath\\examplefile.txt。如果未指定本地路径，则默认从示例程序所属项目对应本地路径中上传文件。
        uploadFileRequest.setUploadFile(filePath);
        // 指定上传并发线程数，默认值为1。
        uploadFileRequest.setTaskNum(5);
        // 指定上传的分片大小，单位为字节，取值范围为100 KB~5 GB。默认值为100 KB。
        uploadFileRequest.setPartSize(1 * 1024 * 1024);
        // 开启断点续传，默认关闭。
        uploadFileRequest.setEnableCheckpoint(true);
        // 记录本地分片上传结果的文件。上传过程中的进度信息会保存在该文件中，如果某一分片上传失败，再次上传时会根据文件中记录的点继续上传。上传完成后，该文件会被删除。
        // 如果未设置该值，默认与待上传的本地文件同路径，名称为${uploadFile}.ucp。
        uploadFileRequest.setCheckpointFile(fileMd5);
        // 文件的元数据。
        uploadFileRequest.setObjectMetadata(meta);
        // 设置上传回调，参数为Callback类型。
        //uploadFileRequest.setCallback("yourCallbackEvent");

        // 断点续传上传。
        try {
            ossClient.uploadFile(uploadFileRequest);

            System.out.println("url:" + hostName + fileMd5 +"." +fileExt);
        } catch (Throwable throwable) {
            throwable.printStackTrace();
        }
    }
}
